import utils from '@/utils/index';

const { calcTwoObjectEqual } = utils; // 不知道导入直接解构会出现问题，

const config = {
  // host: '47.106.165.17',
  host: '127.0.0.1',
  // port: 3000,
  port: 80,
};
class MyWebSocket {
  isReconnect = true; // 默认中断自动重连
  // 参数配置配置
  config = {}
  // websoket实例
  ws = null;
  // 回调实例列表 格式
  messageList = []
  constructor(params = {}) {
    this.config = params;
    this.init();
  }
  // 公有方法
  /**
   * (options: {
        code: '1', // 标识消息类型，唯一的，重复传入同一code无效
        // 其他参数待定
      }
      callback: () =>{})
   */
  addMessageQueue(params = {}) {
    const already = this.messageList.some(item => calcTwoObjectEqual(item.options, params.options)); // 已经有了
    if (!already) { // 不存在才添加
      this.messageList.push(params);
    }
  }

  send(data) {
    const sendData = typeof data !== 'string' ? JSON.stringify(data) : data;
    this.ws.send(sendData);
  }
  // 关闭连接
  close() {
    this.isReconnect = false;
    this.ws.close();
    this.ws = null;
  }
  // 重新打开连接
  open() {
    this.isReconnect = true;
    this.init();
  }

  // 下面的只是私有方法
  init() {
    this.connection();
    this.onMessage();
    this.onClose();
    this.onError();
  }
  connection() {
    const host = this.config.host || '127.0.0.1';
    const port = this.config.port || '3000';
    this.ws = new WebSocket(`ws://${host}:${port}`);
  }
  onMessage() {
    if (this.ws) {
      this.ws.onmessage = (res) => {
        console.log(999, res);
        try {
          const resObj = JSON.parse(res.data);
          // 找对应code, 并执行回调
          const messageEvent = this.messageList.find(item =>
            // 判断 resObj.options 和messageList=> item.options，是否属性和值完全一致
            calcTwoObjectEqual(item.options, resObj.options),
          );

          if (messageEvent) {
            messageEvent.callback(resObj.data);
          } else {
            console.error('回调code未注册:', resObj);
          }
        } catch (error) {
          console.error(`_onMessage报错${new Error(error)}`);
        }
      };
    }
  }
  onClose() {
    this.ws.onclose = function () {
      if (this.isReconnect) {
        this.connection();
      }
    };
  }
  onError() {
    this.ws.onerror = function (error) {
      console.error('ws产生了错误：', new Error(error));
    };
  }
}

export default new MyWebSocket(config);


/**
// 通信格式
{
  options: {

  },
  data: {
    // 里面可能有
    msg: '',
    等等
  }
}
*/
